package IO;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
//计算机读取速度:读取寄存器>读取内存>读取磁盘(每次都差个几千倍)
//尽量减少读取磁盘的速度,推荐这种写法
public class fileDemo4 {
    //一次读取1024个字节
    public static void main(String[] args) {
        try(InputStream inputStream = new FileInputStream("./test.txt")){
            byte[] buffer = new byte[1024];
            while(true){
                //这份代码中的read就会尝试把参数的这个buffer给填满.
                //buffer是1024个字节.
                //假设该文件的长度是2049,读取过程:
                //第一次循环,读取出一个1024个字节,放到buffer数组中,read返回一个1024;
                //第二次循环,读取出1024个字节,buffer数组中,read返回一个1024;
                //第三次循环,读取出1024个字节,buffer数组中,read返回1;
                //第四次循环,此时已经读到文件末尾了(EOF),read返回-1;
                int len = inputStream.read(buffer);
                if(len == -1){
                    break;
                }
                //这个地方就不能按照字节分别打印了,而需要把三个字节合并到一起,作为整体(String)来打印
//                for (int i = 0; i < len; i++) {
//                    System.out.printf("%c",buffer[i]);
//                }

                //这个写法是一个铤而走险的写法,如果文件中包含汉子和英文混合,这里就容易出现问题
                //在Java标准库中,已经对于字符集有了内置的解决方案,不需要咱们在这里自己来实现
//                for (int i = 0; i < len; i+=3) {
//                    //把这三个字节,按照UTF-8的格式来打造出一个String来
//                    String s = new String(buffer,i,3,"UTF-8");
//                    System.out.print(s);
//                }

            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
/**
 * 如果文件中有中文,此时再去读取,就会有异常出现.
 * 因为中文的编码方式和英文不太一样.
 * 如果是英文的话,直接就是ascii码,就比较简单.
 * 如果是中文的话,就需要使用UTF_8或者GBK,就会更复杂.
 *
 * 代码中的%c其实相当于就是按照ascii的方式进行打印.
 * 这个时候,如果读取的这个字节,只是UTF-8或者GBK的一个部分,此时
 * 很可能这个结果不是一个合法的ascii值.于是这里就出现异常了.
 *
 * 一个汉字在UTF-8中,是由3个字节构成的
 */
